package com.niiwoo.civet.trade.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.math.NumberUtils;


/**
* @ClassName: AmountUtil
* @Description: 金额处理工具类
* @author Elliott
* @date Dec 18, 2014 4:45:33 PM
* 
*/

public class SysNumberUtil {
	
	private final static String[] pattern = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌",
			"玖" };
	private final static String[] cPattern = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" };
	private final static String[] cfPattern = { "", "角", "分" };
	private final static String ZERO = "零";
	
	private static DecimalFormat df=new DecimalFormat("#,##0.00");

	public SysNumberUtil() {
		System.out.println("run...");
	}

	/**
	 * @Title: amountChineseFormat
	 * @Description: 将数字的金额转换为汉字大写金额，通常用于合同、发票等
	 * @param moneyString
	 *            金额
	 * @return String 返回类型
	 */
	public static String amountChineseFormat(String moneyString) {
		int dotPoint = moneyString.indexOf("."); // 判断是否为小数
		String moneyStr;
		if (dotPoint != -1) {
			moneyStr = moneyString.substring(0, moneyString.indexOf("."));
		} else {
			moneyStr = moneyString;
		}
		StringBuffer fraction = null; // 小数部分的处理,以及最后的yuan.
		StringBuffer ms = new StringBuffer();
		for (int i = 0; i < moneyStr.length(); i++) {
			ms.append(pattern[moneyStr.charAt(i) - 48]); // 按数组的编号加入对应大写汉字
		}
		int cpCursor = 1;
		for (int j = moneyStr.length() - 1; j > 0; j--) {
			ms.insert(j, cPattern[cpCursor]); // 在j之后加字符,不影响j对原字符串的相对位置
			// 只是moneyStr.length()不断增加
			// insert(j,"string")就在j位置处插入,j=0时为第一位
			cpCursor = cpCursor == 8 ? 1 : cpCursor + 1; // 亿位之后重新循环
		}

		while (ms.indexOf("零拾") != -1) { // 当十位为零时用一个"零"代替"零拾"
			// replace的起始于终止位置
			ms.replace(ms.indexOf("零拾"), ms.indexOf("零拾") + 2, ZERO);
		}
		while (ms.indexOf("零佰") != -1) { // 当百位为零时,同理
			ms.replace(ms.indexOf("零佰"), ms.indexOf("零佰") + 2, ZERO);
		}
		while (ms.indexOf("零仟") != -1) { // 同理
			ms.replace(ms.indexOf("零仟"), ms.indexOf("零仟") + 2, ZERO);
		}
		while (ms.indexOf("零万") != -1) { // 万需保留，中文习惯
			ms.replace(ms.indexOf("零万"), ms.indexOf("零万") + 2, "万");
		}
		while (ms.indexOf("零亿") != -1) { // 同上
			ms.replace(ms.indexOf("零亿"), ms.indexOf("零亿") + 2, "亿");
		}
		while (ms.indexOf("零零") != -1) {// 有连续数位出现零，即有以下情况，此时根据习惯保留一个零即可
			ms.replace(ms.indexOf("零零"), ms.indexOf("零零") + 2, ZERO);
		}
		while (ms.indexOf("亿万") != -1) { // 特殊情况，如:100000000,根据习惯保留高位
			ms.replace(ms.indexOf("亿万"), ms.indexOf("亿万") + 2, "亿");
		}
		while (ms.length() > 1 && ms.lastIndexOf("零") == ms.length() - 1) { // 当结尾为零，不必显示
			ms = ms.delete(ms.lastIndexOf("零"), ms.lastIndexOf("零") + 1);
		}

		int end;
		if ((dotPoint = moneyString.indexOf(".")) != -1) { // 是小数的进入
			String fs = moneyString.substring(dotPoint + 1, moneyString.length());
			if (!"0".equals(fs) && (fs.indexOf("00") == -1 || fs.indexOf("00") >= 1)) {// 若前两位小数全为零，则跳过操作、最后一位是零
				end = fs.length() > 2 ? 2 : fs.length(); // 仅保留两位小数
				fraction = new StringBuffer(fs.substring(0, end));
				// 最后一位是0 则删除
				if (fraction.lastIndexOf("0") > 0) {
					fraction = new StringBuffer(fs.substring(0, end - 1));
				}
				for (int j = 0; j < fraction.length(); j++) {
					fraction.replace(j, j + 1, pattern[fraction.charAt(j) - 48]); // 替换大写汉字
				}
				for (int i = fraction.length(); i > 0; i--) { // 插入中文标识
					fraction.insert(i, cfPattern[i]);
				}
				fraction.insert(0, "元"); // 为整数部分添加标识
			} else {
				fraction = new StringBuffer("元整");
			}

		} else {
			fraction = new StringBuffer("元整");
		}

		ms.append(fraction); // 加入小数部分
		return ms.toString();
	}


	/**
	 * 支持到千亿，超过千亿就报错了
	 * */
	public static String changeFigureToBig(Integer value) {
		char[] hunit = { '十', '百', '千' }; // 段内位置表示
		char[] vunit = { '万', '亿' }; // 段名表示
		char[] digit = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' }; // 数字表示
		String head = String.valueOf(value); // 转化成字符串

		String bigValue = ""; // 整数部分转化的结果
		// 处理小数点前面的数
		char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组
		char zero = '0'; // 标志'0'表示出现过0
		byte zeroSerNum = 0; // 连续出现0的次数
		for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字
			int idx = (chDig.length - i - 1) % 4; // 取段内位置
			int vidx = (chDig.length - i - 1) / 4; // 取段位置
			if (chDig[i] == '0') { // 如果当前字符是0
				zeroSerNum++; // 连续0次数递增
				if (zero == '0') { // 标志
					zero = digit[0];
				} else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
					bigValue += vunit[vidx - 1];
					zero = '0';
				}
				continue;
			}
			zeroSerNum = 0; // 连续0次数清零
			if (zero != '0') { // 如果标志不为0,则加上,例如万,亿什么的
				bigValue += zero;
				zero = '0';
			}
			bigValue += digit[chDig[i] - '0']; // 转化该数字表示
			if (idx > 0) {
				bigValue += hunit[idx - 1];
			}
			if (idx == 0 && vidx > 0) {
				bigValue += vunit[vidx - 1]; // 段结束位置应该加上段名如万,亿
			}
		}
		if (bigValue.startsWith("一十")) {
			bigValue = bigValue.replaceAll("一十", "十");
		}
		return bigValue; // 返回正确表示
	}

	/**
	 * 将List<String>转为List<Integer>
	 * @param strList 字符集合
	 * @param largerZero 是否只保留正整数
	 * @return 返回一个集合，参数非法时默认一个空集合
	 */
	public static List<Integer> stringList2IntList(List<String> strList,boolean largerZero){
		List<Integer> list = new ArrayList<Integer>();
		if(strList != null && strList.size() > 0){
			for (String str : strList) {
				int v = NumberUtils.toInt(str);
				if(v > 0 || !largerZero){
					list.add(v);
				}
			}
		}
		return list;
	}
	
	/**
	* @Title: getProgress 
	* @Description: 处理进度百分比 
	* @param obj
	 */
	public static Object getProgress(Object obj){
		if(obj==null){
			return 0;
		}
		String str = obj.toString();
		if(str.startsWith("99.")){
			str="99";
		}
		if(obj instanceof Double){
			return Double.valueOf(str);
		} else if(obj instanceof Integer){
			return Integer.valueOf(str);
		} else if(obj instanceof BigDecimal){
			return new BigDecimal(str);
		} else if(obj instanceof String){
			return str;
		} else {
			return obj;
		}
	}
	/**
	* @Title: getProgress 
	* @Description: 计算进度
	* @param userAmount
	* @param amount
	* @return int    返回类型  
	 */
	public static int getProgress(BigDecimal userAmount, BigDecimal amount){
		if(amount.doubleValue()==0){
			return 0;
		}
		BigDecimal temp = userAmount.divide(amount,4,BigDecimal.ROUND_HALF_DOWN).multiply(BigDecimal.valueOf(100));
		temp = (BigDecimal) getProgress(temp);
		temp = temp.setScale(0,BigDecimal.ROUND_HALF_DOWN);
		return temp.intValue();
	}
	
	/**
	* @Title: getProgress 
	* @Description: 计算进度
	* @param userAmount
	* @param amount
	* @return int    返回类型  
	 */
	public static int getProgress(int userAmount, int amount){
		if(amount==0){
			return 0;
		}
		BigDecimal b1 = new BigDecimal(userAmount);
		BigDecimal b2 = new BigDecimal(amount);
		return getProgress(b1, b2);
	}
	/**
	* @Title: getProgress 
	* @Description: 计算进度
	* @param userAmount
	* @param amount
	* @return int    返回类型  
	 */
	public static int getProgress(double userAmount, double amount){
		if(amount==0){
			return 0;
		}
		BigDecimal b1 = new BigDecimal(userAmount);
		BigDecimal b2 = new BigDecimal(amount);
		return getProgress(b1, b2);
	}

	/**
	 * 去金额末尾.0
	 * @return
	 */
	public static String subAmount(BigDecimal decimal){
		if(decimal == null){
			return "";
		}
		String str = decimal.setScale(1, BigDecimal.ROUND_DOWN).toString();
		if(str.endsWith(".0")){
			return str.substring(0, str.length()-2);
		}
		return str;
	}
	
	public static String formatNew(BigDecimal value){
		return df.format(value);
	}
	
	public static void main(String[] args) {
		// String tmp = changeFigureToBig(10);
		// System.out.println(tmp);
		// tmp = changeFigureToBig(2071234);
		// System.out.println(tmp);
		// tmp = changeFigureToBig(1);
		// System.out.println(tmp);
		// tmp = changeFigureToBig(2);
		// System.out.println(tmp);
		// System.out.println(changeFigureToBig(8));
		// System.out.println(changeFigureToBig(7));
		// System.out.println(changeFigureToBig(5));
		// tmp = changeFigureToBig(10000000);
		// System.out.println(tmp);
		// System.out.println(amountChineseFormat("1000502000000000000000000000002.123009"));
//		System.out.println(amountChineseFormat("3500.50"));
//		System.out.println(getProgress(10.01));
//		System.out.println(getProgress(10));
//		System.out.println(getProgress(99.99));
//		System.out.println(getProgress("99.99"));
//		System.out.println(getProgress(new BigDecimal(99.9)));
		BigDecimal b1 = new BigDecimal(297);
		BigDecimal b2 = new BigDecimal(300);
		System.out.println(getProgress(b1,b2));
	}

}
